package sas

import (
	"fmt"

	maes "github.com/micro-plat/lib4go/security/aes"
	"github.com/micro-plat/lib4go/types"
)

//AESEncrypt 加密数据
//mode 加密类型/填充模式,不传默认为:CFB/NULL
func (n *sasClient) AESEncrypt(input types.XMap, mode ...string) (data types.XMap, err error) {
	//获取密钥
	res, err := n.SecretGet(AESStr)
	if err != nil {
		return nil, err
	}

	return n.aesEncrypt(input, res.AesSecret, mode...)
}

//AESEncrypt 加密数据
func (n *sasClient) aesEncrypt(input types.XMap, key string, mode ...string) (data types.XMap, err error) {
	//如果没有需要加解密的字段  直接返回原来的
	data = input
	if len(n.encryptName) == 0 {
		return
	}

	for _, v := range n.encryptName {
		if input.Has(v) && input.GetString(v) != "" {
			str, err := maes.Encrypt(input.GetString(v), key, mode...)
			if err != nil {
				return nil, fmt.Errorf("AESEncrypt 加密异常,err:%+v", err)
			}
			data[v] = str
		}
	}
	return
}

//AESDecrypt 解密数据
//mode 加密类型/填充模式,不传默认为:CFB/NULL
func (n *sasClient) AESDecrypt(input types.XMap, mode ...string) (data types.XMap, err error) {
	//获取密钥
	res, err := n.SecretGet(AESStr)
	if err != nil {
		return nil, err
	}

	return n.aesDecrypt(input, res.AesSecret, mode...)
}

//AESDecrypt 解密数据
func (n *sasClient) aesDecrypt(input types.XMap, key string, mode ...string) (data types.XMap, err error) {
	//如果没有需要加解密的字段  直接返回原来的
	data = input
	if len(n.encryptName) == 0 {
		return
	}
	for _, v := range n.encryptName {
		if input.Has(v) && input.GetString(v) != "" {
			str, err := maes.Decrypt(input.GetString(v), key, mode...)
			if err != nil {
				return nil, fmt.Errorf("AESDecrypt 解密异常,err:%+v", err)
			}
			data[v] = str
		}
	}
	return
}
